import cv2
import numpy as np

img = cv2.imread("../images/shudu.png", cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (0,0), fx=0.5, fy=0.5)

# 使用Sobel算子进行边缘提取
# 1. 计算水平梯度
grad_x = cv2.Sobel(img, -1, 1, 0)
# 2. 计算垂直梯度
grad_y = cv2.Sobel(img, -1, 0, 1)
# 3. 合并梯度
grad = cv2.addWeighted(grad_x, 0.5, grad_y, 0.5, 0)

img_stack = np.hstack([img, grad_x, grad_y, grad])
cv2.imshow('image VS', img_stack)
cv2.waitKey(0)

#---------------------------------------------------------------------------------

# 使用Sobel算子的加强版 Scharr 进行边缘提取
# 1. 计算水平梯度
grad_x = cv2.Scharr(img, -1, 1, 0)
# 2. 计算垂直梯度
grad_y = cv2.Scharr(img, -1, 0, 1)
# 3. 合并梯度
grad = cv2.addWeighted(grad_x, 0.5, grad_y, 0.5, 0)

img_stack = np.hstack([img, grad_x, grad_y, grad])
cv2.imshow('image VS', img_stack)
cv2.waitKey(0)

#---------------------------------------------------------------------------------

# 使用 Laplacian 算子 提取边缘
# 注意：Laplacian算子的卷积核中已包含水平方向和垂直方向的系数，所以在函数中无需指定 dx 和 dy
img_Laplacian = cv2.Laplacian(
    img,
    -1,
    ksize=3
)

img_stack = np.hstack([img, img_Laplacian])
cv2.imshow('image VS', img_stack)
cv2.waitKey(0)

#---------------------------------------------------------------------------------

